package cn.wmw.demo;

import cn.wmw.domain.User;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamDemo_2 {

    /**
     * 利用stream流将list转化为map使用，其中会遇见两类问题
     * （1）转换map，key重复问题；代码中使用(key1,key2)->key2表达式可以解决此类问题，如果出现重复的key就使用key2覆盖前面的key1,
     *      也可以定义成(key1,key2)->key1，保留key1,根据自己的业务场景来调整。
     * （2）空指针异常，即转为map的value是null。这个可以用filter过滤；
     * @param users
     * @return
     */
    public Map<String, User> listToMap(List<User> users){
        Map<String, User> stringUserMap = users.stream().collect(Collectors.toMap(User::getName, Function.identity(), (key1, key2) -> key1));
        return stringUserMap;
    }

    /**
     * 利用stream流将map转化为list
     * @param userMap
     * @return
     */
    public List<User> mapToList(Map<String, User> userMap){
        List<User> userMapList = userMap.entrySet().stream().map(item -> item.getValue()).collect(Collectors.toList());
        return userMapList;
    }

    /**
     * 利用stream中的判断，对数据结果进行验证与统计
     * @param userList
     */
    public void determine(List<User> userList){
        // 判断的条件里，任意一个元素成功，返回true。例如：我判断list中height属性有大于1.8的，结果就返回true
        boolean anyMatch = userList.stream().anyMatch(user -> user.getHeight() > 1.8);
        // 判断的条件里，所有元素成功，返回true。例如：我判断list中height属性所有都大于1.65的，结果就返回true
        boolean allMatch = userList.stream().allMatch(user -> user.getHeight() > 1.65);
        // 判断的条件里，所有元素失败，返回true。例如：我判断list中height属性所有都没有大于1.65的，结果就返回true
        boolean noneMatch = userList.stream().noneMatch(user -> user.getHeight() > 1.65);
        // 求取满足判断条件的总数和
        long count = userList.stream().filter(user -> user.getHeight() > 1.7).count();
        System.out.println("anyMatch的结果为："+ anyMatch);
        System.out.println("allMatch的结果为："+ allMatch);
        System.out.println("noneMatch的结果为："+ noneMatch);
        System.out.println("符合条件的总数为："+ count);
    }
}
